'''MainWindow'''
import sys

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QImage, QPixmap, QKeyEvent
from PyQt5.QtWidgets import QMessageBox,QInputDialog
from PyQt5.QtCore import Qt
from fatigue_algo.scrfd import scrfd
from fatigue_algo.landmark_mbv2.onnx.detector import Detector

from GUI.params.blinkSet import Ui_BlinkSet_MainWindow

'''眨眼参数配置窗口'''
class BlinkParamWindow(QtWidgets.QMainWindow, Ui_BlinkSet_MainWindow):

    def __init__(self,cfg, preParamWindow = None, nextParamWindow = None, detectWindow = None, detect_handler = None):
        '''
        :param cfg: 疲劳检测算法的配置文件
        :param preParamWindow: 当前参数子界面的前一个页面
        :param nextParamWindow: 当前参数子界面的后一个页面
        :param detect_handler: 疲劳算法处理器
        '''
        super(BlinkParamWindow,self).__init__()
        self.cfg = cfg
        self.setupUi(self)  #初始化时创建窗口对象，但点击next时再显示
        self.init()  #界面对象初始化，以及按钮事件绑定
        self.preParamWindow = preParamWindow  # 上一个参数子页面
        self.nextParamWindow = nextParamWindow  # 下一个参数子页面
        self.handler = detect_handler  # 疲劳算法处理器
        self.blink_algo_type = 0 #眨眼检测算法类型（0-固定EAR阈值，1-波谷算法，2-EAR阈值二次校准算法）
        self.last_ParamWindow_Flag = False  # 最后一个参数配置子窗口的标志位

    #在未旋转眨眼检测算法之前，隐藏参数设置
    def init(self):
        #默认勾选EAR固定阈值方法
        self.radioButton.setChecked(True)
        self.label_2.setEnabled(True); self.lineEdit.setEnabled(True)
        self.reset()  #重置默认参数

        self.label_3.setEnabled(False); self.lineEdit_2.setEnabled(False)
        self.label_4.setEnabled(False); self.lineEdit_3.setEnabled(False)
        self.pushButton_2.setVisible(False)  #"上一步"按钮默认关闭

        #按钮事件绑定
        self.radioButton.clicked.connect(lambda : self.set_paramsSet_Visible())
        self.radioButton_2.clicked.connect(lambda : self.set_paramsSet_Visible())
        self.radioButton_3.clicked.connect(lambda : self.set_paramsSet_Visible())
        self.pushButton.clicked.connect(lambda : self.next())
        self.pushButton_3.clicked.connect(lambda : self.reset())

    # 设置"上一步"按钮可见
    def set_preButton_Visible(self):
        self.pushButton_2.setVisible(True)
        self.pushButton_2.clicked.connect(lambda : self.pre())

    #根据哪个radioButton被选中，决定哪个参数配置可见
    def set_paramsSet_Visible(self):
        # 固定EAR阈值
        if(self.radioButton.isChecked()):
            self.label_2.setEnabled(True); self.lineEdit.setEnabled(True)
            self.label_3.setEnabled(False); self.lineEdit_2.setEnabled(False)
            self.label_4.setEnabled(False); self.lineEdit_3.setEnabled(False)
            self.blink_algo_type = 0
        # 波谷算法参数设置
        elif(self.radioButton_2.isChecked()):
            self.label_2.setEnabled(False); self.lineEdit.setEnabled(False)
            self.label_3.setEnabled(True); self.lineEdit_2.setEnabled(True)
            self.label_4.setEnabled(True); self.lineEdit_3.setEnabled(True)
            self.blink_algo_type = 1
        # 非以上两种情况（即EAR阈值二次校准算法）
        else:
            self.label_2.setEnabled(False); self.lineEdit.setEnabled(False)
            self.label_3.setEnabled(False); self.lineEdit_2.setEnabled(False)
            self.label_4.setEnabled(False); self.lineEdit_3.setEnabled(False)
            self.blink_algo_type = 2

    #完成参数配置: 将输入的参数装填如cfg中
    def paramSet(self):
        # 眨眼配置信息包括：眨眼检测算法选择（A:固定阈值，B:波谷算法，C:二次校准算法）；
        # 如果选择A，获取指定参数；
        self.cfg['blink_algo'] = self.blink_algo_type
        if(self.blink_algo_type == 0):
            EAR_thres = float(self.lineEdit.text())
            self.cfg["EAR_thres"] = EAR_thres  # EAR固定阈值
        # 如果选择B，获取指定参数；
        elif (self.blink_algo_type == 1):
            valley_length, valley_diff_thres = int(self.lineEdit_2.text()), float(self.lineEdit_3.text())
            self.cfg["valley_length"] = valley_length  # 波谷时窗长度
            self.cfg["valley_diff_thres"] = valley_diff_thres # 波谷骤减阈值
        # 如果选择C，无需配置

        # 配置PERCLOS参数
        PERCLOS_time_window_length = int(self.lineEdit_4.text())
        self.cfg["PERCLOS_time_window_length"] = PERCLOS_time_window_length # PERCLOS时窗长度
        print(self.cfg)

    # 跳转至上一个参数配置窗口
    def pre(self):
        self.preParamWindow.cfg = self.cfg
        self.preParamWindow.show()  # 显示下一个参数配置子窗口
        self.close()

    #跳转至下一个参数配置窗口
    def next(self):
        self.paramSet()
        self.handler.cfg = self.cfg  #更新handler的cfg配置文件
        #判断是否为终止界面
        if(not self.last_ParamWindow_Flag):
            self.nextParamWindow.cfg = self.cfg   #传递cfg
            self.nextParamWindow.handler = self.handler  #传递handler
            self.nextParamWindow.show()  #显示下一个参数配置子窗口
            self.close()
        else:
            QMessageBox.information(self, "提示", "正在为你配置算法")
            self.close()
            self.handler.detect()
        # QMessageBox.information(self,'警告','请检查参数配置是否符合要求')  #参数设置建议与检查

    #重置默认参数
    def reset(self):
        # 参数回显
        self.lineEdit.setText(str(self.cfg["EAR_thres"]))  # EAR固定阈值
        self.lineEdit_2.setText(str(self.cfg["valley_length"]))  # 波谷时窗长度
        self.lineEdit_3.setText(str(self.cfg["valley_diff_thres"]))  # 波谷骤减阈值
        self.lineEdit_4.setText(str(self.cfg["PERCLOS_time_window_length"]))  # PERCLOS时窗长度